package Song.Han.demo04;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/*
解决线程安全问题的第三种方案：Lock锁
    java.util.concurrent.Locks.Lock接口
步骤：
    1.在成员位置创建ReentrantLock对象
    2.在可能出现安全问题的代码前调用Lock接口中的lock()方法，获取锁
    3.在可能出现安全问题的代码后调用Lock接口中的unlock()方法，释放锁
 */
public class RunnableLock implements Runnable {
    private int ticket = 100;

    //1.在成员位置创建ReentrantLock对象
    Lock l = new ReentrantLock();

    @Override
    public void run() {
        //判断是否有票
        while (ticket > 0) {
            //2.在可能出现安全问题的代码前调用Lock接口中的lock()方法，获取锁
            l.lock();
            try {
                if (ticket > 0) {
                    Thread.sleep(10);
                    System.out.println(Thread.currentThread().getName() + "正在卖第" + ticket + "张票");
                    ticket--;
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                //3.在可能出现后调用Lock接口中的unlock()方法，释放锁
                l.unlock();//无论程序是否异常，都会把锁释放
            }

        }
    }

}
